import logging
import unittest

import requests
from parameterized import parameterized

from api.RechargeApi import RechargeApi
from api.openAccountApi import OpenAccountApi
from api.regLoginApi import RegLoginApi
from api.tenderApi import TenderApi
from common.common_assert import common_assert1, common_assert
from common.html_util import html_util
from common.mysql import init_tender_info
from common.read_json import read_json


class TestTender(unittest.TestCase):
    @classmethod
    def setUpClass(cls) -> None:
        """
        功能：类前置，创建借款标
        """
        # 调用

        init_tender_info()

    def setUp(self) -> None:
        """
        方法前置
        """
        # 创建session对象
        self.session = requests.session()
        # 实例化登录模块封装的类
        self.reg_login_api = RegLoginApi(self.session)
        # 实例化开户模块封装的类
        self.open_account_api = OpenAccountApi(self.session)
        # 实例化充值模块封装的类
        self.rechargeApi = RechargeApi(self.session)
        # 实例化投资模块封装的类
        self.tender_Api = TenderApi(self.session)

    def tearDown(self) -> None:
        """
        功能：方法后置，关闭session对象
        """
        # 关闭session对象
        self.session.close()

    @parameterized.expand(read_json('investment', 'investment'))
    def test01_tender(self, case_name, body, login_body, exp_status_code, exp_status, description):
        # 实现登录接口

        self.reg_login_api.user_login(login_body)
        # 实现投资接口
        # 打印用例名称
        print(case_name)
        logging.info(case_name)
        # 调用投资接口
        res = self.tender_Api.tender(body=body)
        # 调用断言工具，进行断言
        common_assert1(self, res, exp_status_code, exp_status, description, case_name)

    def test02_third_tender(self):
        # 实现登录接口
        login_body = {
            "keywords": "18708309001",
            "password": "123456a"
        }
        self.reg_login_api.user_login(login_body)
        # 调用登录接口
        body = {
            "id": 642,
            "depositCertificate": -1,
            "amount": 100
        }
        res = self.tender_Api.tender(body=body)
        # 调用html_util 工具
        a = html_util(res)
        # 调用第三方接口
        res = self.tender_Api.third_tender(url=a[0], body=a[1])
        print(res.text)
        # 断言
        self.assertEqual(200, res.status_code)
        self.assertIn('OK', res.text)

    # 投资业务流程
    def test03_tender_process(self):
        # 将使用的数据，设置为变量，方便进行统一管理
        # 获取图片验证码
        r = "4"
        # 获取短信验证码
        body = {"phone": "18708309010",
                "imgVerifyCode": "8888",
                "type": "reg"}

        # 1.图片验证码接口

        # 通过调用封装的图片验证码接口的方法，获取响应结果
        res_1 = self.reg_login_api.get_img_verify_code(r)
        # 断言状态码
        self.assertEqual(200, res_1.status_code)

        # 2.获取短信验证码接口
        # 通过调用封装的短信验证码接口的方法，获取响应结果
        res_2 = self.reg_login_api.get_phone_verify_code(body)
        # 断言-通用断言
        common_assert(self, res_2, 200, 200, '短信发送成功')

        # 3.注册接口
        zc_body = {"phone": "18708309010", "password": "123456a",
                   "verifycode": "8888",
                   "phone_code": "666666",
                   "dy_server": "on"}
        # 通过调用封装的注册接口的方法，获取响应结果
        res_3 = self.reg_login_api.user_register(zc_body)
        # 断言-通用断言
        common_assert(self, res_3, 200, 200, '注册成功')

        # 4.登录接口
        login_body = {"keywords": "18708309010", "password": "123456a"}
        # 通过调用封装的登录接口的方法，获取响应结果
        res_4 = self.reg_login_api.user_login(login_body)
        # 断言-通用断言
        common_assert(self, res_4, 200, 200, '登录成功')

        # 5.实名认证接口
        rea_lname = {"realname": "胡汉三", "card_id": "110101199903074595"}
        # 通过调用封装的实名认证接口的方法，获取响应结果
        res_5 = self.open_account_api.realname(body=rea_lname)
        # 断言-通用断言
        common_assert(self, res_5, 200, 200, '提交成功')
        # 实名认证信息断言

        # 6.开户接口
        # 通过调用封装的开户接口的方法，获取响应结果
        res_6 = self.open_account_api.open_account()
        # 断言-通用断言
        common_assert(self, res_6, 200, 200, 'form')
        # 7.第三方开户接口
        # 通过调用封装的获取第三方接口请求数据的方法，获取第三方开户接口的url和请求体数据
        a = html_util(response=res_6)
        # 通过调用封装的第三方开户接口的方法，传入url和请求体数据，获取响应结果
        res_7 = self.open_account_api.third_open_account(url=a[0], form_dict=a[1])
        # 断言状态码
        self.assertEqual(200, res_7.status_code)

        # 断言响应体数据
        self.assertIn('OK', res_7.text)

        # 8.获取充值验证码接口
        r = "123"
        # 通过调用封装的获取充值验证码接口的方法，获取响应结果
        res_8 = self.rechargeApi.get_recharge_verify_code(r)
        # 断言状态码
        self.assertEqual(200, res_8.status_code)

        # 9.充值接口
        recharge_body = {"paymentType": "chinapnrTrust", "amount": "100000", "formStr": "reForm", "valicode": "8888"}
        # 通过调用封装的充值接口的方法，获取响应结果
        res_9 = self.rechargeApi.recharge(recharge_body)
        # 断言-通用断言
        common_assert(self, res_9, 200, 200, 'form')
        # 10.第三方充值接口
        # 通过调用封装的获取第三方接口请求数据的方法，获取第三方开户接口的url和请求体数据
        a1 = html_util(response=res_9)
        # 通过调用封装的第三方充值接口的方法，传入url和请求体数据，获取响应结果
        res_10 = self.rechargeApi.third_recharge(url=a1[0], data=a1[1])
        # 断言状态码
        self.assertEqual(200, res_10.status_code)

        # 断言响应体数据
        self.assertIn('OK', res_10.text)

        # 11.投资接口
        tender_body = {"id": 642, "depositCertificate": -1,
         "amount": 1000}
        # 通过调用封装的投资接口的方法，获取响应结果
        res_11 = self.tender_Api.tender(tender_body)
        # 断言-通用断言
        common_assert(self, res_11, 200, 200, 'form')
        # 12.第三方投资接口
        # 通过调用封装的获取第三方接口请求数据的方法，获取第三方开户接口的url和请求体数据
        a12 = html_util(response=res_11)
        # 通过调用封装的第三方投资接口的方法，传入url和请求体数据，获取响应结果
        res_12 = self.tender_Api.third_tender(url=a12[0], body=a12[1])
        # 断言状态码
        self.assertEqual(200, res_12.status_code)

        # 断言响应体数据
        self.assertIn('OK', res_12.text)
